var config = require("config.js");

const api = {
  indexImgs: config.domain + "/indexImgs"
}

/**
 * 封装网络请求
 * 
 * @param {String} url 请求地址
 * @param {Object} data 请求体
 * @param {Boolean} isJson 正文参数类型, 默认为json, 有时候服务器需要接收键值对形式的参数, 可以设置该参数为false
 * @param {Boolean} returnError 如果设置true错误手动处理 默认是封装方法进行统一处理 有的时候某一个页面就不遵循这个规则所以开放了此属性来增强灵活性
 * @param {String} method 请求类型
 */
const request = function (url, data, isJson, returnError, method) {

  let token = wx.getStorageSync('token');

  let header = null;

  if (method == 'GET') {
    // GET请求无Content-Type
    header = {
      // 可以对token统一进行设置
      "X-Access-Token": token
    }
  } else {
    header = {
      // 可以对token统一进行设置
      "X-Access-Token": token,
      // 设置Content-Type
      "Content-Type": isJson ? "application/json" : "application/x-www-form-urlencoded"
    }
  }

  return new Promise(function (resove, reject) {
    wx.request({
      url: url,
      method: method,
      data: data,
      header: header,
      success(res) {
        // 00000 请求成功
        if (res.data.code === '00000') {
          resove(res, null)
          return
        }

        // A00004 未授权
        if (res.data.code === 'A00004') {
          wx.navigateTo({
            url: '/pages/login/login',
          })
          return
        }

        // A00005 服务器出了点小差
        if (res.data.code === 'A00005') {
          console.error('============== 请求异常 ==============')
          console.log('接口: ', params.url)
          console.log('异常信息: ', responseData)
          console.error('============== 请求异常 ==============')
          wx.showToast({
            title: '服务器出了点小差~',
            icon: 'none'
          })
        }

        // A00001 用于直接显示提示用户的错误，内容由输入内容决定
        if (res.data.code === 'A00001') {
          wx.showToast({
            title: responseData.msg || 'Error',
            icon: 'none'
          })
          return
        }

        // 其他异常
        if (res.data.code !== '00000') {
          // console.log('params', params)
          wx.hideLoading();
          console.log(`接口: ${params.url}`)
          console.log(`返回信息： `, res)
        }
      },
      fail(error) {
        if (returnError) {
          resove(null, error)
        } else {
          wx.hideLoading();
          wx.showToast({
            title: "服务器出了点小差",
            icon: "none"
          });
        }
      }
    })
  })
}

const req = {

  /**
   * 根据网络请求类型对号入座, 这里需要注意的是get请求的data叫做parameters
   * 改名的目的就是为了要与data进行区分, data默认是json放在请求body中 {"id": "123"}
   * 而get请求没有body, 所以参数会拼接到url上 比如 www.baidu.com/?id=1
   */
  get: function (url, parameters = {}, returnError = false) {
    return request(url, parameters, false, returnError, 'GET');
  },
  post: function (url, data, isJson = true, returnError = false) {
    return request(url, data, isJson, returnError, 'POST');
  },
  put: function (url, data, isJson = true, returnError = false) {
    return request(url, data, isJson, returnError, 'PUT');
  },
  delete: function (url, data, isJson = true, returnError = false) {
    return request(url, data, isJson, returnError, 'DELETE');
  }
}

exports.req = req;
exports.api = api;